<?php
/**
 * Description of GenericDAO
 * Todos los demás DAO deben heredar esta clase que es la única que tiene el objeto conector
 * y tiene unos métodos generales para todos los DAO
 * @author Paola Andrea Pedraza
 */

include_once '../Configuracion/DataBaseConection.php';

class GenericDAO {
    
   /**
     * El conector de la base de datos
     * @var DataBaseConection
     */
   protected $Conector;
   
   /**
    * CONSTANTES DE LA CLASE
    */
   const NOMBRES_COLUMNAS='{{:NOMBRES_COLUMNAS:}}';
   const VALORES_CAMPOS='{{:VALORES_CAMPOS:}}';
   const UPDATE_CAMPOS='{{:UPDATE_CAMPOS:}}';
   
   
   public function __construct() {
        $this->Conector = new DataBaseConection();
    }
    
    /**
     * Función que se utiliza para obtener los nombres de las columnas de una tabla
     * NOTA: Si se usa para hacer inserciones o actualizaciones, los parámetros entrantes deben coincidir
     * con los nombres de las columnas.
     * @param String $p_nom_tabla
     * @return Array()  -> Un array con los nombres de las columnas
     */
    public function getNombresColumnasXTabla($p_nom_tabla){
        $sql="SELECT DISTINCT
                lower(COLUMN_NAME) columna
              FROM 
                information_schema.COLUMNS 
              WHERE 
                TABLE_NAME = '$p_nom_tabla'";
        return $this->Conector->RetornarArrayFromQuery($sql);
    }
    
    
    /**
     * Función que inserta valores en cualquier tabla
     * NOTA: El array de Nombres debe conincidir con los indices del array de valores.
     * @param String $p_tabla
     * @param Array $arrayNombres
     * @param Array $arrayValores
     * @return boolean
     */
    public function insertarRegistro($p_tabla, $arrayNombres, $arrayValores){
        
        $sql="INSERT INTO $p_tabla ( ".GenericDAO::NOMBRES_COLUMNAS." ) VALUES ( ".GenericDAO::VALORES_CAMPOS." )";
        $columnas='';
        $valores='';
        for($c=0;$c<count($arrayNombres['columna']);$c++){       
            if(isset($arrayValores[$arrayNombres['columna'][$c]]) && !empty($arrayValores[$arrayNombres['columna'][$c]])){
                $columnas.=$arrayNombres['columna'][$c].",";
                $valores.="'".$arrayValores[$arrayNombres['columna'][$c]]."',";
            }
        }
        
        
        /*
         * Esta linea reemplaza los wildcards del query original, con los valores obtenidos en el for y retorna el resultado que es un boolean
         */
        $sql=  str_replace(GenericDAO::VALORES_CAMPOS, substr($valores, 0, -1), str_replace(GenericDAO::NOMBRES_COLUMNAS, substr($columnas, 0, -1), $sql)); 
        //print $sql;
        return $this->Conector->onlyRun($sql);
        
    }
    
    /**
     * Función para hacer un update de cualquier tabla
     * NOTA: El array de Nombres debe conincidir con los indices del array de valores. Sólo se puede hacer el where con una llave
     * @param String $p_tabla
     * @param Array $arrayNombres
     * @param Array $arrayValores
     * @param String $campoLlave
     * @param String $valorLlave
     * @return boolean
     */
    public function actualizarRegistro($p_tabla, $arrayNombres, $arrayValores, $p_campoLlave, $p_valorLlave){
        
        $sql="UPDATE $p_tabla SET ".GenericDAO::UPDATE_CAMPOS. " WHERE $p_campoLlave='$p_valorLlave'";
        $updateCampos='';
        for($c=0;$c<count($arrayNombres['columna']);$c++){
            if(isset($arrayValores[$arrayNombres['columna'][$c]]) && $arrayNombres['columna'][$c]!=$p_campoLlave){
                $updateCampos.=$arrayNombres['columna'][$c]."='".$arrayValores[$arrayNombres['columna'][$c]]."',";
                
            }
        }
        
        $sql=  str_replace(GenericDAO::UPDATE_CAMPOS, substr($updateCampos, 0, -1), $sql);
        
        return $this->Conector->onlyRun($sql);
    }
    
    /**
     * Función que indica si un registro existe o no en la base de datos.
     * @param String $p_tabla Nombre de la tabla
     * @param String $p_campoLlave Nombre del campo para el where
     * @param String $p_valorLlave Valor del campo para el Where
     * @return boolean
     */
    public function existeRegistro($p_tabla, $p_campoLlave, $p_valorLlave){
        
        $sql="  SELECT 
                    *
                FROM
                    $p_tabla
                WHERE 
                    $p_campoLlave='$p_valorLlave'";

        if($this->Conector->returnnumFil($sql)>0)
            return TRUE;
        else
            return FALSE;
    }
    
    
    
    public function getAllFromTable($p_tabla){
        $sql="SELECT
                * 
              FROM 
                $p_tabla";
        return $this-> Conector->RetornarArrayFromQuery($sql);
        
    }
    
    public function getUltimoID($tabla){
        return $this->Conector->returnLast($tabla);
        
    }
    
    
    
        
    
}

?>
